package com.smh.myreflect2;

import com.smh.myreflect1.Student;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ConstructorDemo3 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//        Class类中用于获取成员方法的方法
//Method[] getMethods():返回所有公共成员方法对象的数组，包括继承的
//Method[]getDeclaredMethods():返回所有成员方法对象的数组，不包括继承的
//Method getMethod(String name, Class<?>... parameterTypes):返回单个公共成员方法对象
//Method getDeclaredMethod(String name, Class<?>.. parameterTypes):返回单个成员方法对象

//Method类中用于创建对象的方法
//Object invoke(Object obj, Object... args):运行方法
//参数一:用obj对象调用该方法
//参数二:调用方法的传递的参数(如果没有就不写)
//返回值:方法的返回值(如果没有就不写)

        Class<?> c = Class.forName("com.smh.myreflect1.Student");
        //包括继承
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("--------------");
        //不包括继承
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }
        System.out.println("---------------");
        //
        Method name = c.getMethod("getName");
        System.out.println(name);
        Method age = c.getDeclaredMethod("setAge", int.class);
        System.out.println(age);

        //运行方法
        Student student = new Student("sad", 12, "ssda");
        Object invoke = name.invoke(student);
        age.setAccessible(true);
        age.invoke(student, 15);
        System.out.println(invoke);
        System.out.println(student);

    }
}
